package com.cskaoyan.javase.oop1._11static._4exercise;

/**
 * 类加载的过程:
 * 1.启动main方法触发Demo类的类加载
 * 然后在执行
 * static Cat cat = new Cat();时
 * 触发Cat类的类加载
 * 然后在执行
 * static Dog dog = new Dog();
 * 触发Dog类的类加载
 * 于是从类加载的顺序上来说
 * Demo最先开始,然后是Cat,最后是Dog
 * 但是Dog最先完成,Demo最后完成
 *
 * 以上过程都是在main方法启动之前完成的
 * 以上已经将三个类全部类加载了,之后的代码运行
 * 都不需要再考虑类加载了!
 *
 * @since 11:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    static Cat cat = new Cat();
    Dog dog = new Dog();
    Dog dog2;
    static Dog dog3;

    /*
        不要忘记启动main方法触发类加载
        类加载过程中会执行静态成员变量的显式赋值
     */
    public static void main(String[] args) {
        System.out.println("hello world!");
        Demo d = new Demo();
    }

    public Demo() {
        System.out.println("demo");
    }
}

class Cat {
    static Dog dog = new Dog();

    public Cat() {
        System.out.println("cat");
    }
}

class Dog {
    static int num = 100;
    /*
        在这里,能不能创建Demo对象呢?
        能不能定义static Cat cat = new Cat();呢?
        实际上是可以定义的
        为什么呢?
     */
    static Cat cat = new Cat();

    public Dog() {
        System.out.println("dog");
    }
}

class Demo2 {
    // 以下代码会导致栈溢出
    // Demo2 d2 = new Demo2();
    /*
        加上static还会栈溢出吗?
        不会
        成员变量是每new一个对象都会存在一个
        但是静态成员变量唯一,所以肯定不会栈溢出
      */
    static Demo2 d2 = new Demo2();
}